<?php
/*************************************************************************
 * http://www.fpdf.org/en/script/script5.php
 * 
 * @author		Olivier
 * 
 * This script implements EAN13 and UPC-A barcodes (the second being a particular case of the first one). Bars are drawn directly in the PDF (no image is generated).
 * EAN13(float x, float y, string barcode [, float h [, float w]])
 * x: abscissa of barcode.
 * y: ordinate of barcode.
 * barcode: value of barcode.
 * h: height of barcode. Default value: 16.
 * w: width of a bar. Default value: 0.35.
 * 
 * UPC_A(float x, float y, string barcode [, float h [, float w]])
 * 
 * Same parameters.
 * 
 * An EAN13 barcode is made up of 13 digits, UPC-A of 12 (leading zeroes are added if necessary). The last digit is a check digit; if it's not supplied, it will be automatically computed. 
 ************************************************************************/
 
/*************************************************************************
 * http://www.fpdf.org/en/script/script46.php
 * 
 * @author		The-eh
 *
 * This script implements Code 39 barcodes. A Code 39 barcode can encode a string with the following characters: digits (0 to 9), uppercase letters (A to Z) and 8 additional characters (- . space $ / + % *).
 * Code39(float xpos, float ypos, string code [, float baseline [, float height]])
 * xpos: abscissa of barcode
 * ypos: ordinate of barcode
 * code: value of barcode
 * height: bar height
 * baseline: corresponds to the width of a wide bar
 ************************************************************************/


if (!defined('__CLASS_FPDF_CODEBAR__'))
{
	define('__CLASS_FPDF_CODEBAR__', true);
	
	require_once(dirname(__FILE__).'/../_fpdf/fpdf.php');		// classe fpdf de Olivier PLATHEY 

	class FPDF_Codebar extends FPDF
	{
		var $footer_param = array();
		
	    function FPDF_Codebar($sens = 'P', $unit = 'mm', $format = 'A4')
	    {
	    	$this->FPDF($sens, $unit, $format);
	    }
		
		function BARCODE_EAN13($x,$y,$barcode,$h=10,$w=.35)
		{
		   return  $this->Barcode($x,$y,$barcode,$h,$w,13);
		}
		
		function BARCODE_UPC_A($x,$y,$barcode,$h=10,$w=.35)
		{
		   return $this->Barcode($x,$y,$barcode,$h,$w,12);
		}
		
		function GetCheckDigit($barcode)
		{
		    //Compute the check digit
		    $sum=0;
		    for($i=1;$i<=11;$i+=2)
		        $sum+=3*$barcode{$i};
		    for($i=0;$i<=10;$i+=2)
		        $sum+=$barcode{$i};
		    $r=$sum%10;
		    if($r>0)
		        $r=10-$r;
		    return $r;
		}
		
		function TestCheckDigit($barcode)
		{
		    //Test validity of check digit
		    $sum=0;
		    for($i=1;$i<=11;$i+=2)
		        $sum+=3*$barcode{$i};
		    for($i=0;$i<=10;$i+=2)
		        $sum+=$barcode{$i};
		    return ($sum+$barcode{12})%10==0;
		}
		
		function Barcode($x,$y,$barcode,$h,$w,$len)
		{
		    //Padding
		    $barcode=str_pad($barcode,$len-1,'0',STR_PAD_LEFT);
		    if($len==12)
		        $barcode='0'.$barcode;
		    //Add or control the check digit
		    if(strlen($barcode)==12)
		        $barcode.=$this->GetCheckDigit($barcode);
		    elseif(!$this->TestCheckDigit($barcode))
		        $this->Error('Incorrect check digit');
		    //Convert digits to bars
		    $codes=array(
		        'A'=>array(
		            '0'=>'0001101','1'=>'0011001','2'=>'0010011','3'=>'0111101','4'=>'0100011',
		            '5'=>'0110001','6'=>'0101111','7'=>'0111011','8'=>'0110111','9'=>'0001011'),
		        'B'=>array(
		            '0'=>'0100111','1'=>'0110011','2'=>'0011011','3'=>'0100001','4'=>'0011101',
		            '5'=>'0111001','6'=>'0000101','7'=>'0010001','8'=>'0001001','9'=>'0010111'),
		        'C'=>array(
		            '0'=>'1110010','1'=>'1100110','2'=>'1101100','3'=>'1000010','4'=>'1011100',
		            '5'=>'1001110','6'=>'1010000','7'=>'1000100','8'=>'1001000','9'=>'1110100')
		        );
		    $parities=array(
		        '0'=>array('A','A','A','A','A','A'),
		        '1'=>array('A','A','B','A','B','B'),
		        '2'=>array('A','A','B','B','A','B'),
		        '3'=>array('A','A','B','B','B','A'),
		        '4'=>array('A','B','A','A','B','B'),
		        '5'=>array('A','B','B','A','A','B'),
		        '6'=>array('A','B','B','B','A','A'),
		        '7'=>array('A','B','A','B','A','B'),
		        '8'=>array('A','B','A','B','B','A'),
		        '9'=>array('A','B','B','A','B','A')
		        );
		    $code='101';
		    $p=$parities[$barcode{0}];
		    for($i=1;$i<=6;$i++)
		        $code.=$codes[$p[$i-1]][$barcode{$i}];
		    $code.='01010';
		    for($i=7;$i<=12;$i++)
		        $code.=$codes['C'][$barcode{$i}];
		    $code.='101';
		    //Draw bars
		    for($i=0;$i<strlen($code);$i++)
		    {
		        if($code{$i}=='1')
		            $this->Rect($x+$i*$w,$y,$w,$h,'F');
		    }
		    
		    $code_w = strlen($code)*$w;
		    $code_t = substr($barcode,-$len);
		    
		    $code_f = $code_w/strlen($code_t)*$this->k/0.60;
		    $code_h = $h+$code_f/$this->k;
		    
		    //Print text uder barcode
		    $this->SetFont('Arial','',$code_f);
		    $this->Text($x,$y+$h+0.90*$code_f/$this->k,$code_t);
		       
		    return array($code_w, $code_h);
		}
		
		function BARCODE_CODE39($xpos, $ypos, $code,$height=10, $baseline=0.5 )
		{
		
		    $wide = $baseline;
		    $narrow = $baseline / 3 ; 
		    $gap = $narrow;
		
		    $barChar['0'] = 'nnnwwnwnn';
		    $barChar['1'] = 'wnnwnnnnw';
		    $barChar['2'] = 'nnwwnnnnw';
		    $barChar['3'] = 'wnwwnnnnn';
		    $barChar['4'] = 'nnnwwnnnw';
		    $barChar['5'] = 'wnnwwnnnn';
		    $barChar['6'] = 'nnwwwnnnn';
		    $barChar['7'] = 'nnnwnnwnw';
		    $barChar['8'] = 'wnnwnnwnn';
		    $barChar['9'] = 'nnwwnnwnn';
		    $barChar['A'] = 'wnnnnwnnw';
		    $barChar['B'] = 'nnwnnwnnw';
		    $barChar['C'] = 'wnwnnwnnn';
		    $barChar['D'] = 'nnnnwwnnw';
		    $barChar['E'] = 'wnnnwwnnn';
		    $barChar['F'] = 'nnwnwwnnn';
		    $barChar['G'] = 'nnnnnwwnw';
		    $barChar['H'] = 'wnnnnwwnn';
		    $barChar['I'] = 'nnwnnwwnn';
		    $barChar['J'] = 'nnnnwwwnn';
		    $barChar['K'] = 'wnnnnnnww';
		    $barChar['L'] = 'nnwnnnnww';
		    $barChar['M'] = 'wnwnnnnwn';
		    $barChar['N'] = 'nnnnwnnww';
		    $barChar['O'] = 'wnnnwnnwn'; 
		    $barChar['P'] = 'nnwnwnnwn';
		    $barChar['Q'] = 'nnnnnnwww';
		    $barChar['R'] = 'wnnnnnwwn';
		    $barChar['S'] = 'nnwnnnwwn';
		    $barChar['T'] = 'nnnnwnwwn';
		    $barChar['U'] = 'wwnnnnnnw';
		    $barChar['V'] = 'nwwnnnnnw';
		    $barChar['W'] = 'wwwnnnnnn';
		    $barChar['X'] = 'nwnnwnnnw';
		    $barChar['Y'] = 'wwnnwnnnn';
		    $barChar['Z'] = 'nwwnwnnnn';
		    $barChar['-'] = 'nwnnnnwnw';
		    $barChar['.'] = 'wwnnnnwnn';
		    $barChar[' '] = 'nwwnnnwnn';
		    $barChar['*'] = 'nwnnwnwnn';
		    $barChar['$'] = 'nwnwnwnnn';
		    $barChar['/'] = 'nwnwnnnwn';
		    $barChar['+'] = 'nwnnnwnwn';
		    $barChar['%'] = 'nnnwnwnwn';
		
			$xpos_dep = $xpos;
		    $code = '*'.strtoupper($code).'*';
		    for($i=0; $i<strlen($code); $i++){
		        $char = $code{$i};
		        if(!isset($barChar[$char])){
		            $this->Error('Invalid character in barcode: '.$char);
		        }
		        $seq = $barChar[$char];
		        for($bar=0; $bar<9; $bar++){
		            if($seq{$bar} == 'n'){
		                $lineWidth = $narrow;
		            }else{
		                $lineWidth = $wide;
		            }
		            if($bar % 2 == 0){
		                $this->Rect($xpos, $ypos, $lineWidth, $height, 'F');
		            }
		            $xpos += $lineWidth;
		        }
		        $xpos += $gap;
		    }
		    
		    $code_w = $xpos-$xpos_dep;
		    $code_t = $code;
		    
		    $code_f = $code_w/strlen($code_t)*$this->k/0.60/3;
		    $code_h = $height+$code_f/$this->k;
		    
		    //Print text uder barcode
		    $this->SetFont('Arial','',$code_f);
		    $this->Text($xpos_dep,$ypos+$height+0.90*$code_f/$this->k,$code_t);
		       
		    return array($code_w, $code_h);
		}
	}
}
?>